{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 1\n",
    "\n",
    "Используйте файл с оценками фильмов ml-latest-small/ratings.csv. Посчитайте среднее время жизни пользователей, которые выставили более 100 оценок. Под временем жизни понимается разница между максимальным и минимальным значением столбца timestamp для данного значения userId."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_ratings = pd.read_csv('ml-latest-small/ratings.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>rating_count</th>\n",
       "      <th>lifetime</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>userId</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>204</td>\n",
       "      <td>203560</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>116</td>\n",
       "      <td>85187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>1700</td>\n",
       "      <td>471393496</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>363</td>\n",
       "      <td>8053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>423</td>\n",
       "      <td>5282</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>162</td>\n",
       "      <td>1365432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>220</td>\n",
       "      <td>91491</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>726</td>\n",
       "      <td>18342129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>172</td>\n",
       "      <td>20267261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>1011</td>\n",
       "      <td>115852276</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        rating_count   lifetime\n",
       "userId                         \n",
       "4                204     203560\n",
       "8                116      85187\n",
       "15              1700  471393496\n",
       "17               363       8053\n",
       "19               423       5282\n",
       "21               162    1365432\n",
       "22               220      91491\n",
       "23               726   18342129\n",
       "26               172   20267261\n",
       "30              1011  115852276"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Создаем новый датафрейм со статистикой количества поставленных оценок для каждого пользователя\n",
    "# Также добавляем для каждого пользователя минимальное и максимальное время\n",
    "df_ratings_agg = (df_ratings[['userId', 'rating', 'timestamp']].groupby(by='userId')\n",
    "                                                               .agg({'rating': 'count', 'timestamp': ['min', 'max']}))\n",
    "# Заменяем мультииндекс в названиях столбцов\n",
    "df_ratings_agg.columns = ['rating_count', 'timestamp_min', 'timestamp_max']\n",
    "# Отфильтровываем значение количества оценок более 100\n",
    "df_ratings_agg = df_ratings_agg[df_ratings_agg.rating_count > 100]\n",
    "# Находим время жизни кажого пользователя\n",
    "df_ratings_agg['lifetime'] = df_ratings_agg['timestamp_max'] - df_ratings_agg['timestamp_min']\n",
    "df_ratings_agg[['rating_count', 'lifetime']][:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 2\n",
    "\n",
    "Дана статистика услуг перевозок клиентов компании по типам (см. файл с кодом занятия).\n",
    "\n",
    "Необходимо сформировать две таблицы:\n",
    "- таблицу с тремя типами выручки для каждого client_id без указания адреса клиента\n",
    "- аналогичную таблицу по типам выручки с указанием адреса клиента\n",
    "\n",
    "Обратите внимание, что в процессе объединения таблиц данные не должны теряться."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>client_id</th>\n",
       "      <th>rzd_revenue</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>111</td>\n",
       "      <td>1093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>112</td>\n",
       "      <td>2810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>113</td>\n",
       "      <td>10283</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>114</td>\n",
       "      <td>5774</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>115</td>\n",
       "      <td>981</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   client_id  rzd_revenue\n",
       "0        111         1093\n",
       "1        112         2810\n",
       "2        113        10283\n",
       "3        114         5774\n",
       "4        115          981"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rzd = pd.DataFrame(\n",
    "    {\n",
    "        'client_id': [111, 112, 113, 114, 115],\n",
    "        'rzd_revenue': [1093, 2810, 10283, 5774, 981]\n",
    "    }\n",
    ")\n",
    "rzd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>client_id</th>\n",
       "      <th>auto_revenue</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>113</td>\n",
       "      <td>57483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>114</td>\n",
       "      <td>83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>115</td>\n",
       "      <td>912</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>116</td>\n",
       "      <td>4834</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>117</td>\n",
       "      <td>98</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   client_id  auto_revenue\n",
       "0        113         57483\n",
       "1        114            83\n",
       "2        115           912\n",
       "3        116          4834\n",
       "4        117            98"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "auto = pd.DataFrame(\n",
    "    {\n",
    "        'client_id': [113, 114, 115, 116, 117],\n",
    "        'auto_revenue': [57483, 83, 912, 4834, 98]\n",
    "    }\n",
    ")\n",
    "auto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>client_id</th>\n",
       "      <th>air_revenue</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>115</td>\n",
       "      <td>81</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>116</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>117</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>118</td>\n",
       "      <td>173</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   client_id  air_revenue\n",
       "0        115           81\n",
       "1        116            4\n",
       "2        117           13\n",
       "3        118          173"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "air = pd.DataFrame(\n",
    "    {\n",
    "        'client_id': [115, 116, 117, 118],\n",
    "        'air_revenue': [81, 4, 13, 173]\n",
    "    }\n",
    ")\n",
    "air"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>client_id</th>\n",
       "      <th>address</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>111</td>\n",
       "      <td>Комсомольская 4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>112</td>\n",
       "      <td>Энтузиастов 8а</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>113</td>\n",
       "      <td>Левобережная 1а</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>114</td>\n",
       "      <td>Мира 14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>115</td>\n",
       "      <td>ЗЖБИиДК 1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>116</td>\n",
       "      <td>Строителей 18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>117</td>\n",
       "      <td>Панфиловская 33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>118</td>\n",
       "      <td>Мастеркова 4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   client_id          address\n",
       "0        111  Комсомольская 4\n",
       "1        112   Энтузиастов 8а\n",
       "2        113  Левобережная 1а\n",
       "3        114          Мира 14\n",
       "4        115        ЗЖБИиДК 1\n",
       "5        116    Строителей 18\n",
       "6        117  Панфиловская 33\n",
       "7        118     Мастеркова 4"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "client_base = pd.DataFrame(\n",
    "    {\n",
    "        'client_id': [111, 112, 113, 114, 115, 116, 117, 118],\n",
    "        'address': ['Комсомольская 4', 'Энтузиастов 8а', 'Левобережная 1а', 'Мира 14', 'ЗЖБИиДК 1', \n",
    "                    'Строителей 18', 'Панфиловская 33', 'Мастеркова 4']\n",
    "    }\n",
    ")\n",
    "client_base"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Данные по клиентам без указания адресов\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>client_id</th>\n",
       "      <th>rzd_revenue</th>\n",
       "      <th>auto_revenue</th>\n",
       "      <th>air_revenue</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>111</td>\n",
       "      <td>1093.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>112</td>\n",
       "      <td>2810.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>113</td>\n",
       "      <td>10283.0</td>\n",
       "      <td>57483.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>114</td>\n",
       "      <td>5774.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>115</td>\n",
       "      <td>981.0</td>\n",
       "      <td>912.0</td>\n",
       "      <td>81.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>116</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4834.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>117</td>\n",
       "      <td>NaN</td>\n",
       "      <td>98.0</td>\n",
       "      <td>13.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>118</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>173.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   client_id  rzd_revenue  auto_revenue  air_revenue\n",
       "0        111       1093.0           NaN          NaN\n",
       "1        112       2810.0           NaN          NaN\n",
       "2        113      10283.0       57483.0          NaN\n",
       "3        114       5774.0          83.0          NaN\n",
       "4        115        981.0         912.0         81.0\n",
       "5        116          NaN        4834.0          4.0\n",
       "6        117          NaN          98.0         13.0\n",
       "7        118          NaN           NaN        173.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Объединяем датафреймы rzd, auto и air. Так как во всех датафреймах у нас только один столбец с одинаковым именем \n",
    "# (client_id) и именно по нему нужно делать объединение, то можно не указывать параметр on в методе merge.\n",
    "# Для сохранения всех данных выбираем способ outer\n",
    "client_revenue = rzd.merge(auto, how='outer').merge(air, how='outer')\n",
    "\n",
    "print('Данные по клиентам без указания адресов')\n",
    "display(client_revenue)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Данные по клиентам c указанием адресов\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>client_id</th>\n",
       "      <th>rzd_revenue</th>\n",
       "      <th>auto_revenue</th>\n",
       "      <th>air_revenue</th>\n",
       "      <th>address</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>111</td>\n",
       "      <td>1093.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Комсомольская 4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>112</td>\n",
       "      <td>2810.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Энтузиастов 8а</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>113</td>\n",
       "      <td>10283.0</td>\n",
       "      <td>57483.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Левобережная 1а</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>114</td>\n",
       "      <td>5774.0</td>\n",
       "      <td>83.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Мира 14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>115</td>\n",
       "      <td>981.0</td>\n",
       "      <td>912.0</td>\n",
       "      <td>81.0</td>\n",
       "      <td>ЗЖБИиДК 1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>116</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4834.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>Строителей 18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>117</td>\n",
       "      <td>NaN</td>\n",
       "      <td>98.0</td>\n",
       "      <td>13.0</td>\n",
       "      <td>Панфиловская 33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>118</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>173.0</td>\n",
       "      <td>Мастеркова 4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   client_id  rzd_revenue  auto_revenue  air_revenue          address\n",
       "0        111       1093.0           NaN          NaN  Комсомольская 4\n",
       "1        112       2810.0           NaN          NaN   Энтузиастов 8а\n",
       "2        113      10283.0       57483.0          NaN  Левобережная 1а\n",
       "3        114       5774.0          83.0          NaN          Мира 14\n",
       "4        115        981.0         912.0         81.0        ЗЖБИиДК 1\n",
       "5        116          NaN        4834.0          4.0    Строителей 18\n",
       "6        117          NaN          98.0         13.0  Панфиловская 33\n",
       "7        118          NaN           NaN        173.0     Мастеркова 4"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Так как нам нужно отобразить адреса только для тех клиентов, которые у нас уже есть в датафрейме без потери данных,\n",
    "# то приемняем метод left\n",
    "client_revenue_with_address = pd.merge(client_revenue, client_base, how='left')\n",
    "\n",
    "print('Данные по клиентам c указанием адресов')\n",
    "display(client_revenue_with_address)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 3\n",
    "\n",
    "В задаче сквозной аналитики вам предоставили данные по местоположению пользователей. Т. е. для каждого user_id известна последовательность координат (широта/долгота), когда они требовались приложению для полноценной работы. Как бы вы добавили эти сведения в таблицу визитов и покупок? Для составления ответа можно использовать вопросы:\n",
    "\n",
    "- У каждого пользователя известен набор координат. А для связывания с визитом или фактом покупки скорее всего потребуется одно-два числа. Как их получить?\n",
    "- Наборы координат одного и того же пользователя могут быть значительно удалены друг от друга. Как это отразится на вопросе расчетах пункта 1?\n",
    "- Какие дополнительные признаки можно получить из координат? Ведь это просто числа, которые сами по себе мало что дают."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Задание вызывает очень много дополнительных вопросов, непонятна структура таблицы визитов и покупок, в каком формате нам отдают геокоординаты, есть ли там еще доп. инфомрация, например, время поулчения этих геокоординат. Поэтому буду придумывать по ходу.\n",
    "\n",
    "У каждого визита / факта покупки есть определенная дата и время. Соответственно, посетитель мог совершать покупку или посещать магазин несколько раз из разных точек земного шара, следовательно количество записей для одного пользователя в таблице визитво может быть несколько и нам нужно понимать как координаты конкретного пользователя относятся к конкретному визиту этого пользователя. Следовательно, если у геокоординат есть время их получения, мы можем по времени геокоординат и по идентификатору клиента соотнести их с покупкой. Время получения геокоординат должно быть примерно равно времени покупки или входу на сайт с некоторой погрешностью. Если для одной и той же даты находится несколько пар координат, то можно попробовать вычислять область круга, в который входят все эти координаты, находить его центр и хранить координаты центра круга и его радиус в таблице визитов. На основании такого круга мы можем понять из какого города человек совершил покупку, какое время суток было и на сонове этих данных можно проанализировать где наш продукт наиболее популярен и в какое время обычно люди совершают покупки у нас."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
